#include "widget.h"
#include "ui_widget.h"
#include "QTime"

Widget::Widget(QWidget *parent, int id) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //    this->setWindowFlags(Qt::WindowStaysOnTopHint);
    this->setWindowFlags(Qt::FramelessWindowHint);      // 隐藏边框
    this->setAttribute(Qt::WA_TranslucentBackground);     // 背景透明

    this->order = 0;
    //    this->tur_act = false;
    this->init_path();

    this->id = id;

    this->parent = parent;

    // 初始化计时器，通用
    timer = new QTimer();
    timer->setInterval(150);   // 0.15s
    timer->start();

    // 显示情况：
    for(int i = 0; i < 3; i++) {
        pet_show[i] = false;
    }

    // 打开数据库连接
    dbase = new DbOperator();
    dbase->OpenDb();

    trainerMsg = dbase->searchTrainerMsg(id);
    init_Pokemon_Msg();
    init_path();
    init_left_btns();

}

Widget::~Widget()
{
    delete ui;
    timer->stop();
    delete timer;
    if (dbase != 0) {
        delete dbase;
        dbase = 0;
    }
}

void Widget::show_firstpet()
{    // 调用此函数显示图片
    if (order == 8) {
        order = 0;
    }
    if (pokemonPicPath.at(0)[order] != QString("")) {       // 路径不为空
        QImage* png = new QImage(pokemonPicPath.at(0)[order]);
        show_pic(png, ui->tur);
        order++;     // 帧数+1
    }
}

void Widget::show_second_pet()
{
    if (order == 8) {
        order = 0;
    }
    if (pokemonPicPath.at(1)[order] != QString("")) {       // 路径不为空
        QImage* png = new QImage(pokemonPicPath.at(1)[order]);
        show_pic(png, ui->tur);
        order++;     // 帧数+1
    }

}

void Widget::show_third_pet()
{
    if (order == 8) {
        order = 0;
    }
    if (pokemonPicPath.at(2)[order] != QString("")) {       // 路径不为空
        QImage* png = new QImage(pokemonPicPath.at(2)[order]);
        show_pic(png, ui->tur);
        order++;     // 帧数+1
    }

}


void Widget::init_path() {
    QVector<QString*> tempnull;
    qSwap(tempnull, pokemonPicPath);   // 调用一次初始化先清除原本的

    for(int i = 0;i<3;i++) {
        pokemonPicPath.push_back(new QString[8]);
    }
    QString* picpath;
    int id;
    for(int i = 0; i < pokemonMsg.length(); i++) {     // 遍历每一只宠物
        id = pokemonMsg.at(i).id;     // 读取宠物id，顺序由trainer中的数据决定
        picpath = pokemonPicPath.at(i);        // 抽出来
        if(id != 0) {       // 宠物位置不为空
            for(int i = 0; i < 8; i++) {
                picpath[i] = QString(con.picpath.at(id-1)).arg(i+1);    // 利用路径模板加载出8帧图片
            }
        }
        else {
            for(int i = 0; i < 8; i++) {
                picpath[i] = QString("");       // 设为空
            }
        }
    }
}

void Widget::init_left_btns()
{
    int id;
    for(int i=0; i<3; i++) {
        id = pokemonMsg.at(i).id;
        if (i == 0)
        {
            if(id == 0) {
                ui->pet_1->setStyleSheet(QString("background-color:transparent;border-image: url(:/icon/images/none.png);"));

            }
            else {
                ui->pet_1->setStyleSheet(QString("background-color:transparent;border-image: url(:/bar/images/head (%1).png);").arg(id));
            }
        }
        else if (i == 1)
        {
            if(id == 0) {
                ui->pet_2->setStyleSheet("background-color:transparent;border-image: url(:/icon/images/none.png);");

            }
            else {
                ui->pet_2->setStyleSheet(QString("background-color:transparent;border-image: url(:/bar/images/head (%1).png);").arg(id));
            }

        }
        else
        {
            if(id == 0) {
                ui->pet_3->setStyleSheet(QString("background-color:transparent;border-image: url(:/icon/images/none.png);"));

            }
            else {
                ui->pet_3->setStyleSheet(QString("background-color:transparent;border-image: url(:/bar/images/head (%1).png);").arg(id));
            }
        }
    }

}

void Widget::closeEvent(QCloseEvent *) {
    emit Exitpoke();   // 关闭时发射信号
}

void Widget::set_true(int index)       // 宠物排序，从1开始
{
    // 先全部设置为false
    for(int i = 0; i < 3; i++) {
        pet_show[i] = false;
    }
    // 展示的设置为true
    pet_show[index-1] = true;

}

void Widget::show_pet_Msg(int no)        // 输入三个中一个的排序加载对应的宠物信息  从一开始
{
    pokemon temp = pokemonMsg.at(no-1);
    QImage png(con.getAtriPicPath(temp.id));
    ui->NO->setText(QString::number(temp.id));
    ui->name->setText(con.getName(temp.id));
    show_pic(&png, ui->type_pic);
    ui->OT->setText(QString::number(temp.fetter));   // 好感度
    ui->IDNO->setText(QString::number(temp.idno));
    QString state = QString("HP状态:%1/%2").arg(temp.curhp).arg(temp.maxhp);
    ui->hp->setText(state);
    state = QString("攻击力：%1").arg(temp.attack);
    ui->attack->setText(state);
    state = QString("防御力：%1").arg(temp.defense);
    ui->defense->setText(state);
}

void Widget::show_skill(int no)
{
    pokemon temp = pokemonMsg.at(no-1);
    QStringList skill = temp.skill.split(".");
    QString skillnum;
    QString picpath;
    QImage *img;
    // 设置技能文字和技能图标
    skillnum = skill.at(0);
    ui->skill_dgb_1->setText(con.getSkillDgb(temp.id, skillnum.toInt()));
    picpath = con.getSkillIcon(con.getSkillAttr(temp.id, skillnum.toInt()));
    img = new QImage(picpath);
    show_pic(img, ui->skill_icon_1);

    skillnum = skill.at(1);
    ui->skill_dgb_2->setText(con.getSkillDgb(temp.id, skillnum.toInt()));
    picpath = con.getSkillIcon(con.getSkillAttr(temp.id, skillnum.toInt()));
    img = new QImage(picpath);
    show_pic(img, ui->skill_icon_2);

    skillnum = skill.at(2);
    ui->skill_dgb_3->setText(con.getSkillDgb(temp.id, skillnum.toInt()));
    picpath = con.getSkillIcon(con.getSkillAttr(temp.id, skillnum.toInt()));
    img = new QImage(picpath);
    show_pic(img, ui->skill_icon_3);

    skillnum = skill.at(3);
    ui->skill_dgb_4->setText(con.getSkillDgb(temp.id, skillnum.toInt()));
    picpath = con.getSkillIcon(con.getSkillAttr(temp.id, skillnum.toInt()));
    img = new QImage(picpath);
    show_pic(img, ui->skill_icon_4);

}

void Widget::init_Pokemon_Msg()
{
    // 清空原本中的数据
    QVector<pokemon> nulltemp;
    qSwap(nulltemp, pokemonMsg);
    // 加载宝可梦数据
    QStringList pokemon_idno_list = trainerMsg.idno.split(".");   // 拥有的pokemon编号
    pokemon temp;
    // 读取trainer中的idno，在pokemon表中查询放入向量中
    for(int i = 0; i < pokemon_idno_list.length(); i++) {
        QString ido = pokemon_idno_list.at(i);
        if (ido != QString("0")) {
            int idno = ido.toInt();
            temp = dbase->searchPokemonMsg(idno);
            pokemonMsg.push_back(temp);
            qDebug() << "insert pokemsg success";
        }
        else {
            dbase->setNullPokemon(temp);
            pokemonMsg.push_back(temp);
            qDebug() << "insert pokemsg success null";
        }
    }

}

template<typename T>
void Widget::show_pic(QImage *img, T tool)
{
    img->scaled(tool->size(), Qt::KeepAspectRatio);    // 第二个参数中有三种模式，详情见https://blog.csdn.net/qq_21449473/article/details/103820668
    tool->setScaledContents(true);   // 是否允许缩放填充
    tool->setPixmap(QPixmap::fromImage(*img));
}

void Widget::on_pet_1_clicked()
{
    if(!pet_show[0] && pokemonMsg.at(0).id != 0) {         // 防止重复点击以及关闭其他
        order = 0;
        disconnect(timer, SIGNAL(timeout()), 0, 0);       // 解绑timeout信号所有绑定的函数
        connect(timer, SIGNAL(timeout()), this, SLOT(show_firstpet()));    // 配套使用
        show_skill(1);
        set_true(1);
        show_pet_Msg(1);
        cur_idno = pokemonMsg.at(0).idno;
    }
}

void Widget::on_pet_2_clicked()
{
    if(!pet_show[1] && pokemonMsg.at(1).id != 0) {
        order = 0;
        disconnect(timer, SIGNAL(timeout()), 0, 0);
        connect(timer, SIGNAL(timeout()), this, SLOT(show_second_pet()));
        show_skill(2);
        set_true(2);
        show_pet_Msg(2);
        cur_idno = pokemonMsg.at(1).idno;

    }
}

void Widget::on_pet_3_clicked()
{
    if(!pet_show[2] && pokemonMsg.at(2).id != 0) {
        order = 0;
        disconnect(timer, SIGNAL(timeout()), 0, 0);
        connect(timer, SIGNAL(timeout()), this, SLOT(show_third_pet()));
        show_skill(3);
        set_true(3);
        show_pet_Msg(3);
        cur_idno = pokemonMsg.at(2).idno;
    }
}

void Widget::on_closeBtn_clicked()
{
    this->close();
    delete dbase;
    dbase = 0;
}

void Widget::on_item1_clicked()
{
    pokemon temp = dbase->searchPokemonMsg(cur_idno);
    QString item = trainerMsg.item;
    QStringList l = item.split(".");
    QString i = l.at(0);
    // 更新操作
    if (i != QString("0")) {
        int itemnum = i.toInt();
        itemnum--;
        i = QString::number(itemnum);        // 临时变量再赋值
        l.replace(0, i);
        i = l.join(".");
        dbase->updateItem(id, i);
        dbase->updatefetter(cur_idno, temp.fetter+1);
        // 重新加载玩家数据
        trainerMsg = dbase->searchTrainerMsg(id);
        // 重新加载宠物数据
        init_Pokemon_Msg();
        // 刷新宠物数据显示：
        for (int j = 0; j < 3; j++) {
            if(pet_show[j]) {
                show_pet_Msg(j+1);
            }
        }
        QMessageBox msgbox;
        msgbox.setText("使用成功   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();

    }
    else {
        QMessageBox msgbox;
        msgbox.setText("物品已用完   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();
    }
}

void Widget::on_item2_clicked()
{
    pokemon temp = dbase->searchPokemonMsg(cur_idno);
    QString item = trainerMsg.item;
    QStringList l = item.split(".");
    QString i = l.at(1);
    // 更新操作
    if (i != QString("0")) {
        int itemnum = i.toInt();
        itemnum--;
        i = QString::number(itemnum);        // 临时变量再赋值
        l.replace(1, i);
        i = l.join(".");
        dbase->updateItem(id, i);
        dbase->updatefetter(cur_idno, temp.fetter+2);
        // 重新加载玩家数据
        trainerMsg = dbase->searchTrainerMsg(id);
        // 重新加载宠物数据
        init_Pokemon_Msg();
        // 刷新宠物数据显示：
        for (int j = 0; j < 3; j++) {
            if(pet_show[j]) {
                show_pet_Msg(j+1);
            }
        }
        QMessageBox msgbox;
        msgbox.setText("使用成功   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();

    }
    else {
        QMessageBox msgbox;
        msgbox.setText("物品已用完   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();
    }


}

void Widget::on_item3_clicked()
{
    pokemon temp = dbase->searchPokemonMsg(cur_idno);
    QString item = trainerMsg.item;
    QStringList l = item.split(".");
    QString i = l.at(2);
    // 更新操作
    if (i != QString("0")) {
        int itemnum = i.toInt();
        itemnum--;
        i = QString::number(itemnum);        // 临时变量再赋值
        l.replace(2, i);
        i = l.join(".");
        dbase->updateItem(id, i);
        dbase->updatefetter(cur_idno, temp.fetter+3);
        // 重新加载玩家数据
        trainerMsg = dbase->searchTrainerMsg(id);
        // 重新加载宠物数据
        init_Pokemon_Msg();
        // 刷新宠物数据显示：
        for (int j = 0; j < 3; j++) {
            if(pet_show[j]) {
                show_pet_Msg(j+1);
            }
        }
        QMessageBox msgbox;
        msgbox.setText("使用成功   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();

    }
    else {
        QMessageBox msgbox;
        msgbox.setText("物品已用完   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();
    }

}

void Widget::on_item4_clicked()
{
    pokemon temp = dbase->searchPokemonMsg(cur_idno);
    QString item = trainerMsg.item;
    QStringList l = item.split(".");
    QString i = l.at(3);
    // 更新操作
    if (i != QString("0")) {
        int itemnum = i.toInt();
        itemnum--;
        i = QString::number(itemnum);        // 临时变量再赋值
        l.replace(3, i);
        i = l.join(".");
        dbase->updateItem(id, i);
        dbase->updatefetter(cur_idno, temp.fetter+4);
        // 重新加载玩家数据
        trainerMsg = dbase->searchTrainerMsg(id);
        // 重新加载宠物数据
        init_Pokemon_Msg();
        // 刷新宠物数据显示：
        for (int j = 0; j < 3; j++) {
            if(pet_show[j]) {
                show_pet_Msg(j+1);
            }
        }
        QMessageBox msgbox;
        msgbox.setText("使用成功   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();

    }
    else {
        QMessageBox msgbox;
        msgbox.setText("物品已用完   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();
    }

}

void Widget::on_item5_clicked()
{
    pokemon temp = dbase->searchPokemonMsg(cur_idno);
    QString item = trainerMsg.item;
    QStringList l = item.split(".");
    QString i = l.at(4);
    // 更新操作
    if (i != QString("0")) {
        int itemnum = i.toInt();
        itemnum--;
        i = QString::number(itemnum);        // 临时变量再赋值
        l.replace(4, i);
        i = l.join(".");
        dbase->updateItem(id, i);
        dbase->updatefetter(cur_idno, temp.fetter+5);
        // 重新加载玩家数据
        trainerMsg = dbase->searchTrainerMsg(id);
        // 重新加载宠物数据
        init_Pokemon_Msg();
        // 刷新宠物数据显示：
        for (int j = 0; j < 3; j++) {
            if(pet_show[j]) {
                show_pet_Msg(j+1);
            }
        }
        QMessageBox msgbox;
        msgbox.setText("使用成功   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();

    }
    else {
        QMessageBox msgbox;
        msgbox.setText("物品已用完   ");
        msgbox.setParent(parent);
        msgbox.move(750, 400);
        msgbox.exec();
    }

}
